home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Interactive 7
/
PC World Interactive 7.iso
/
program
/
cprog.EXE
/
OBJ2ASM.ZIP
/
OREPORT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-01
|
7KB
|
240 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "o.h"
/*
** Local Prototypes
*/
char *ext_type[] = {
"ABS", /* Or Unknown */
"NEAR",
"FAR",
"BYTE",
"WORD",
"DWORD",
"FWORD",
"QWORD",
"TBYTE"
};
void print_ext( ext_rec )
EXT_T *ext_rec;
{
char operand[80];
char *var_type;
char *label;
int type;
NODE_T *pub_node;
PUB_T *pub_rec;
/*
** Make sure name doesn't already exist as a public symbol
*/
pub_node = start( public_tree, RIGHT );
while ( pub_node != public_tree ) {
pub_rec = (PUB_T *)pub_node->data;
if ( strcmp(pub_rec->name, ext_rec->name) == 0 ) {
return;
}
pub_node = traverse( pub_node, RIGHT );
}
if ( ext_rec->scope ) {
label = "";
} else {
label = ";Static";
}
if ( ext_rec->com_ext == 0 ) {
if ( ext_rec->type == UNKNOWN && ext_rec->pos_abs == FALSE ) {
ext_rec->type = NEAR;
}
sprintf( operand, "%s:%s", ext_rec->name, ext_type[ext_rec->type] );
out_label( label );
out_opcode( "EXTRN" );
tab_seek(3);
out_operand( operand );
} else {
switch( ext_rec->var_type ) {
case 0x61:
var_type = "COMM FAR";
break;
case 0x62:
var_type = "COMM";
break;
default:
fmt_error( "Unknown Communal Variable Type" );
break;
}
type = ext_rec->type;
sprintf( operand, "%s:%s:%ld", ext_rec->name, ext_type[type],
ext_rec->size );
out_label( label );
if ( ext_rec->var_type == 0x62 ) {
tab_seek(3);
}
out_opcode( var_type );
out_operand( operand );
}
}
void list_ext()
{
NODE_T *seg_node;
NODE_T *ext_node;
EXT_T *ext_rec;
int data_index;
data_index = 0;
seg_node = start( segment_tree, RIGHT );
while ( seg_node != segment_tree ) {
seg_rec = (SEG_T *)seg_node->data;
if ( stricmp(seg_rec->class->name, "DATA") == 0 ) {
data_index = seg_rec->index;
break;
}
seg_node = traverse( seg_node, RIGHT );
}
out_newline();
ext_node = start( extern_tree, LEFT );
while ( ext_node != extern_tree ) {
ext_rec = (EXT_T *)ext_node->data;
if ( ext_rec->used == 0 || ext_rec->used == -1 ) {
if ( compatibility == 2 && data_index != 0 ) {
if ( ext_rec->type == 2 || ext_rec->type == 3 ||
ext_rec->type == 4 || ext_rec->type == 5 ) {
if ( ext_rec->used == 0 ) {
sex_insert( data_index, ext_rec );
ext_rec->used = data_index;
}
} else {
print_ext( ext_rec );
}
} else {
print_ext( ext_rec );
}
}
ext_node = traverse( ext_node, LEFT );
}
}
void list_pub()
{
NODE_T *pub_node;
PUB_T *pub_rec;
char comment[50];
char *label;
out_newline();
pub_node = start( public_tree, RIGHT );
while ( pub_node != public_tree ) {
pub_rec = (PUB_T *)pub_node->data;
if ( pub_rec->scope ) {
label = "";
} else {
label = ";Static";
}
if ( pub_rec->domain == PUBLIC ) {
sprintf( comment, "Located at %d:%04lXh Type = %d", pub_rec->seg_idx, pub_rec->offset, pub_rec->type );
out_label( label );
out_opcode( "PUBLIC" );
tab_seek(3);
out_operand( pub_rec->name );
out_comment( comment );
} else {
#ifdef DEBUG
sprintf( comment, "Located at %d:%04lXh Type = %d", pub_rec->seg_idx, pub_rec->offset, pub_rec->type );
out_label( label );
out_opcode( "PRIV" );
tab_seek(3);
out_operand( pub_rec->name );
out_comment( comment );
#endif
}
pub_node = traverse( pub_node, RIGHT );
}
}
void list_struc()
{
NODE_T *struc_node;
STRUC_T *struc_rec;
char temp[50];
int index;
char *cp;
char ch;
dword dup_cnt;
int type;
int mem_cnt;
int times;
index = 0;
out_newline();
struc_node = start( struc_tree, RIGHT );
while ( struc_node != struc_tree ) {
struc_rec = (STRUC_T *)struc_node->data;
struc_rec->index = index;
cp = struc_rec->form;
sprintf( temp, "struct_%d", index );
out_line( temp, "struc", "", "" );
mem_cnt = 0;
while ( (ch=*cp) != '\0' ) {
switch( ch ) {
case '(':
dup_cnt = atol( cp+1 );
break;
case ',':
type = atoi( cp+1 );
break;
case ')':
sprintf( temp, "s%dm_%d", index, mem_cnt );
out_label( temp );
out_directive( size_to_opcode(type_to_size(type), ×) );
if ( dup_cnt == 1L ) {
strcpy( temp, "?" );
} else {
sprintf( temp, "%ld dup (?)", dup_cnt );
}
out_operand( temp );
out_endline();
mem_cnt++;
default:
break;
}
cp++;
}
sprintf( temp, "struct_%d", index );
out_line( temp, "ends", "", "" );
out_newline();
index++;
struc_node = traverse( struc_node, RIGHT );
}
}
void list_fix()
{
NODE_T *fix_node;
FIX_T *fix_rec;
char comment[50];
out_newline();
fix_node = start( fix_tree, RIGHT );
while ( fix_node != fix_tree ) {
fix_rec = (FIX_T *)fix_node->data;
sprintf( comment, "Fixup at 0%02Xh:0%04Xh:0%04Xh", fix_rec->seg_idx,
fix_rec->dat_offset, fix_rec->offset );
out_line( "", ";", comment, "" );
fix_node = traverse( fix_node, RIGHT );
}
}